package com.lefull.lefullbase.utils.helper;

import android.animation.FloatEvaluator;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.annotation.SuppressLint;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.TextView;

import java.text.DecimalFormat;

public class AnimHelper {

	/**
	 * 设置动画合集
	 * 
	 * @param anims
	 *            需要执行的动画
	 * @return
	 */
	public static AnimationSet getAnimSet(Animation... anims) {
		AnimationSet animationSet = new AnimationSet(true);
		for (Animation anim : anims) {
			animationSet.addAnimation(anim);
		}
		return animationSet;
	}

	/**
	 * 获取透明渐变动画
	 * 
	 * @param from
	 *            开始透明度
	 * @param to
	 *            结束透明度
	 * @param durationMillis
	 *            过程时长
	 * @param repeatCount
	 *            重复次数
	 * @return
	 */
	public static Animation getAlphaAnim(float from, float to, long durationMillis, int repeatCount) {
		Animation alpha = new AlphaAnimation(from, to);
		alpha.setRepeatCount(repeatCount);
		alpha.setDuration(durationMillis);
		return alpha;
	}

	/**
	 * 获取旋转动画
	 * 
	 * @param from
	 *            开始角度
	 * @param to
	 *            结束角度
	 * @param durationMillis
	 *            旋转过程时间
	 * @param repeatCount
	 *            重复次数
	 * @return
	 */
	public static Animation getRotateAnim(float from, float to, long durationMillis, int repeatCount) {
		// 第一个参数fromDegrees为动画起始时的旋转角度
		// 第二个参数toDegrees为动画旋转到的角度
		// 第三个参数pivotXType为动画在X轴相对于物件位置类型
		// 第四个参数pivotXValue为动画相对于物件的X坐标的开始位置
		// 第五个参数pivotXType为动画在Y轴相对于物件位置类型
		// 第六个参数pivotYValue为动画相对于物件的Y坐标的开始位置
		Animation rotate = new RotateAnimation(from, to, RotateAnimation.RELATIVE_TO_SELF, 0.5f,
				RotateAnimation.RELATIVE_TO_SELF, 0.5f);
		rotate.setRepeatCount(repeatCount);
		rotate.setDuration(durationMillis);
		return rotate;
	}

	/**
	 * 获取伸缩动画
	 * 
	 * @param fx
	 *            x方向开始大小
	 * @param tx
	 *            x方向结束大小
	 * @param fy
	 *            y方向开始大小
	 * @param ty
	 *            y方向结束大小
	 * @param durationMillis
	 *            过程时间
	 * @param repeatCount
	 *            重复次数
	 * @return
	 */
	public static Animation getScaleAnim(float fx, float tx, float fy, float ty, long durationMillis, int repeatCount) {
		// 第一个参数fromX为动画起始时 X坐标上的伸缩尺寸
		// 第二个参数toX为动画结束时 X坐标上的伸缩尺寸
		// 第三个参数fromY为动画起始时Y坐标上的伸缩尺寸
		// 第四个参数toY为动画结束时Y坐标上的伸缩尺寸
		// 第五个参数pivotXType为动画在X轴相对于物件位置类型
		// 第六个参数pivotXValue为动画相对于物件的X坐标的开始位置
		// 第七个参数pivotXType为动画在Y轴相对于物件位置类型
		// 第八个参数pivotYValue为动画相对于物件的Y坐标的开始位置
		Animation scale = new ScaleAnimation(fx, tx, fy, ty, Animation.RELATIVE_TO_SELF, 0.5f,
				Animation.RELATIVE_TO_SELF, 0.5f);
		scale.setRepeatCount(repeatCount);
		scale.setDuration(durationMillis);
		return scale;
	}

	/**
	 * 获取位移动画
	 * 
	 * @param fx
	 *            开始x位置
	 * @param tx
	 *            结束x位置
	 * @param fy
	 *            开始y轴位置
	 * @param ty
	 *            结束y轴位置
	 * @param durationMillis
	 *            持续时间
	 * @param repeatCount
	 *            重复次数
	 * @return
	 */
	public static Animation getTranslateAnim(float fx, float tx, float fy, float ty, long durationMillis,
			int repeatCount) {
		Animation translate = new TranslateAnimation(fx, tx, fy, ty);
		translate.setRepeatCount(repeatCount);// 设置动画执行多少次，如果是-1的话就是一直重复
		translate.setDuration(durationMillis);
		return translate;
	}
	
	/**
	 * textView数字变动动画
	 * @param target
	 * @param start
	 * @param end
	 * @param duration
	 */
	public static void autoIncrement(final TextView target, final float start,
		      final float end, long duration) {

		    ValueAnimator animator = ValueAnimator.ofFloat(start, end);

		    animator.addUpdateListener(new AnimatorUpdateListener() {
		      private FloatEvaluator evalutor = new FloatEvaluator();
		      private DecimalFormat format = new DecimalFormat("####0.0#");

		      @SuppressLint("NewApi")
			@Override
		      public void onAnimationUpdate(ValueAnimator animation) {

		        float fraction = animation.getAnimatedFraction();
		        float currentValue = evalutor.evaluate(fraction, start, end);
		        target.setText(format.format(currentValue));
		      }
		    });
		    animator.setDuration(duration);
		    animator.start();

		  }
}
